<?php


namespace app\common\queue;


use app\admin\model\Job;
use app\admin\model\Order;
use think\Db;
use think\Log;
use think\queue\Job as Jobs;

class Start
{
    /**
     * fire是消息队列默认调用的方法
     * @param Jobs $job 当前的任务对象
     * @param mixed $data 发布任务时自定义的数据
     */
    public function fire(Jobs $job, $data)
    {
        // 有效消息到达消费者时可能已经不再需要执行了
        if (!$this->checkJob($data)) {
            $job->delete();
            return;
        }

        // 执行业务处理
        if ($this->doJob($data)) {
            $job->delete();// 任务执行成功后删除
            Log::log("自动[ 开始 ] [ 招聘ID:  {$data['id']} ] 任务成功执行");
        } else {
            //检查任务重试次数
            if ($job->attempts() > 3) {
                Log::log("在日志不会看到这句话");
                $job->delete();
            }
        }
    }

    /**
     * 消息在到达消费者时可能已经不需要执行了
     * @param mixed $data 发布任务时自定义的数据
     * @return boolean 任务执行的结果
     */
    private function checkJob($data)
    {
        // 判断订单是否存在 判断状态
        $id   = $data['id'];
        $date = date("Y-m-d H:i:s");
        $find = Db::name('job')->where(['id' => $data['id']])->find();
        if ($find) {
            if ($find['status'] != 2) {
                Log::log("[ 招聘开始失败:记录已找到，状态值不为2（报名中） ] [ 招聘ID: $id ] [ 时间: $date]");
                return false;
            } elseif ($find['queue_update'] != $data['queue_update']) {
                Log::log("[ 招聘开始中止:记录已找到，这是修改之前的版本 ] [ 招聘ID: $id ] [ 时间: $date]");
                return false;
            } else {
                return true;
            }
        } else {
            Log::log("[ 招聘开始失败:记录未找到 ] [ 招聘ID: $id ] [ 时间: $date]");
            return false;
        }
    }

    /**
     * 根据消息中的数据进行实际的业务处理
     * @param mixed $data 发布任务时自定义的数据
     * @return boolean 任务执行的结果
     */
    private function doJob($data)
    {
        $id   = $data['id'];
        $date = date("Y-m-d H:i:s");

        $model_job = new Job();
        // 这里需要调整 订单信息 job信息
        $find = $model_job->where(['id' => $id])->find();
        if ($find) {
            // 调整job
            if ($find->getData('status') != 2) {
                Log::log("[ 招聘开始失败:记录已经找到，状态值不为2（报名中） ] [ 招聘ID: $id ] [ 时间: $date]");
            } else {
                $find->save(['status' => 3]);
                // 统计已报名酒店未确认的订单数量
                $count = Db::name('order')->where(['job_id' => $id, 'status' => 1])->count('id');
                // 调整job已报名人数
                if($count > 0){
                    Db::name('job')->where(['id' => $id])->setDec('job_number');
                }
                // 将已报名酒店未确认的 调整为 已拒绝
                Db::name('order')->where(['job_id' => $id, 'status' => 1])->update(['status' => 7]);

            }
        } else {
            Log::log("[ 招聘开始失败:记录未找到 ] [ 招聘ID: $id ] [ 时间: $date]");
        }

        // 处理失败也返回 true
        return true;
    }
}